const Router = require('koa-router')
const { TokenValidator,NotEmptyValidator } = require('../../validator/validator')
const { LoginType } = require('../../lib/enum')
const { User } = require('../../models/user')
const { generateToken } = require('../../../core/util')
const { Auth } = require('../../../middleware/auth')
const { WXManager } = require('../../services/wx')
const router = new Router({
  prefix: '/v1/token',
})
// 通用获取token令牌
router.post('/', async (ctx) => {
  //  // TokenValidator 验证参数是否合法
  const v = await new TokenValidator().validate(ctx)
  // 定义变量 token
  let token
  // 通过拿到 v.get('body.type') 类型进行相应的登录逻辑
  switch (v.get('body.type')) {
    //USER_EMAIL 用户邮箱登录
    case LoginType.USER_EMAIL:
      // 邮箱登录（account=邮箱号码,secret=密码）
      token = await emailLogin(v.get('body.account'), v.get('body.secret'))
      break
    //USER_MINI_PROGRAM 用户小程序登录
    case LoginType.USER_MINI_PROGRAM:
      token = await WXManager.codeToToken(v.get('body.account'))
      break
    //ADMIN_EMAIL 管理员邮箱登录
    case LoginType.ADMIN_EMAIL:
      break
    //ParameterException 默认抛出异常 没有相应的处理函数
    default:
      throw new global.errs.ParameterException('没有相应的处理函数')
  }

  ctx.body = {
    token,
  }
})
// 验证token令牌
router.post('/verify',async (ctx,next)=>{
  const v = await new NotEmptyValidator().validate(ctx)
  const result = Auth.verifyToken(v.get('body.token'))
  ctx.body = {
    is_valid:result
  }
})
// 验证邮箱登录 （account=邮箱号码,secret=密码）
async function emailLogin(account, secret) {
  // 
  const user = await User.verifyEmailPassword(account, secret)
  return (token = generateToken(user.id, Auth.USER))
}
module.exports = router
